/**==============================================================================================================
 * 											   函数目录
 * ==============================================================================================================
 *
 *
 * function openUserRef(returnValue)								打开用户级参照窗口(单选)。包括部门人员、岗位人员、角色人员
 * function openUserRefM(returnValue)								打开用户级参照窗口(多选)。包括部门人员、岗位人员、角色人员
 * function openDeptRefM(returnValue)								打开部门级参照窗口(多选)。
 * function openReference(domainFileName,operateName,returnValue,propConfigName,isTreeOfDict,typeCodeOfDict,masterParams)
 * 																	打开通用参照窗口(单选)
 * function openReferenceM(domainFileName,operateName,returnValue,propConfigName,isTreeOfDict,typeCodeOfDict,masterParams)
 * 																	打开通用参照窗口(多选)
 * 
 * function selectUsersForType(seleObjId,valueEleId,titleEleId)		根据不同的人员类型，选择不同的人员范围
 * 
 * function openReferenceJson(domainFileName,operateName,masterParams,detailParams)
 * 																	取得json格式的参照数据(数组形式)
 * function openReferenceJsonPage(domainFileName,operateName,propConfigName,masterParams,detailParams)
 * 																	取得json格式的参照数据(将数据组装成page对象形式)
 * 
 * 
 * function openAttachment(formId,docId,isTypeManage)				打开附件管理模块窗口。多版本控制
 * function openAttachmentS(formId,docId,isTypeManage)				打开附件管理模块窗口。无多版本控制
 * function openNewWin( url, width, height )						打开新窗口
 * function openDialog( url, width, height)							打开模式对话框窗口
 * function openCellPrint()											打开cell的打印、预览窗口
 *
 * function getUrlArgs()											在页面上取得url中的参数
 * function getUrlActionName(url)									取得url中的action地址
 * function getPoint(el)											取得元素所处位置
 * function getJsFilePath(jsFileName)								js脚本中获取本js文件的详细路径。取得路径后可以加载图片、css文件等资源
 * function getJsFileAbsPath(jsFileName)							在js脚本中，取得指定js文件的绝对路径
 * function loadCssJsFile(path,type,title)							动态(按需)加载js和css文件
 * function KeyDown()												屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键
 *
 * function	isEmpty(val)											是否为空值
 *
 *
 *
 * ----------------------------------------------------------------------------------------------------------------
 * 											用户等待窗口操作（数据加载时请用户等待）
 * ----------------------------------------------------------------------------------------------------------------
 * function openWaitDialog()										打开用户等待窗口
 * function closeWaitDialog()										头等用户等待窗口
 *
 *
 * ----------------------------------------------------------------------------------------------------------------
 * 											生成cell数据。数据结构请参见cellocx.js中的内容
 * ----------------------------------------------------------------------------------------------------------------
 *	function getCellDataForTable(cellData,$table)					生成cell中的表格数据
 *	function getCellDataForForm(cellData,$itemContain)				生成cell中的表单元素值
 *----------------------------------------------------------------------------------------------------------------
 *	function GetContents(name)										判断fck（即html编辑器）是否为空，为空则返回false，反之返回true；
 * ----------------------------------------------------------------------------------------------------------------
 * 											String对象功能增强函数
 * ----------------------------------------------------------------------------------------------------------------
 * String.prototype.trim 		= function()								删除字符串前后的空格
 * String.prototype.startsWith 	= function( value )							判断字字符串是否以指定的子串开头
 * String.prototype.remove 		= function(start,length)					从字符串中的指定位置开始，删除指定长度的子串
 * String.prototype.replaceAll 	= function(searchArray,replaceArray)		进行字符串的批量查找替换（查找、替换的内容是一对一的数组，即可以进行批量的替换）
 * String.prototype.toTitleCase	= function()								将字符串转换为标题样式
 * String.prototype.replaceString = function(find_string,replace_string)	查找字符串并进行替换
 * String.prototype.left 		= function(total_chars)						取字符串左边的子串(从最左边开始取)
 * String.prototype.right 		= function(total_chars)						取字符串右边的子中(从最右边开始取)
 * String.prototype.toDate		= function()								将日期格式的字符串转换为Date对象
 *==============================================================================================================*/





//打开窗口的状态
var __width = window.screen.availWidth * (((window.screen.availHeight/window.screen.availWidth)<=10/16)?0.4:0.5);
var _dialogWindowStatus = "scroll:no;center:yes;status:no;resizable:yes;dialogHeight:" + (window.screen.availHeight * 0.6) + "px;dialogWidth:" + __width + "px;top:0;left:0;";


/**
 * 打开用户级参照窗口(单选)。包括部门人员、岗位人员、角色人员
 *
 * @param (String) returnValue		调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 */
function openUserRef(returnValue){
	//var windowStatus = 'height=440, width=450, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,status=no';
	var s = "consultAction!enterDb.shtml?directive=common/doubleConsult.ftl";
	s = s + "&" + returnValue;
	// 是否有“取已存在的数据”参数
	if(returnValue.indexOf("getSavedData=true")>=0){
		s = s + "&getSavedData=true";
	}
	//window.open (s, 'newwindow', windowStatus);
	var child = window.showModalDialog(s,window,_dialogWindowStatus);
}

/**
 * 打开通用参照窗口(左边是树，右边是存放区的参照）
 *
 * @param (String) 	domainFileName		调用xml文件名
 * @param (String) 	operateName			调用的查询名称
 * @param (String) 	returnValue			调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 */
function openDoubleConsultRefM(domainFileName,operateName,returnValue){
    var s = "consultAction!enterDb.shtml?directive=common/doubleConsult.ftl&selectOpt=1";
    if(isEmpty(domainFileName)||isEmpty(operateName)){
        alert("domainFileName和operateName不能为空!");
    }
    //consultType 为参照类型，目前只有custom一种
    s = s + "&domainFileName=" + domainFileName+"&operateName="+operateName+"&"+returnValue+"&consultType=custom";
    // 是否有“取已存在的数据”参数
    if(returnValue.indexOf("getSavedData=true")<=0){
        s = s + "&getSavedData=true";
    }
    var child = window.showModalDialog(s,window,_dialogWindowStatus);
}

/**
 * 打开通用参照窗口(左边是树，右边是存放区的参照）----可以自定义根节点
 *
 * @param (String) 	domainFileName		调用xml文件名
 * @param (String) 	operateName			调用的查询名称
 * @param (String) 	returnValue			调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 */
function openDoubleConsultByRootIdRefM(domainFileName,operateName,returnValue,masterParams){
    var s = "consultAction!enterDb.shtml?directive=common/doubleConsult.ftl&selectOpt=1";
    if(isEmpty(domainFileName)||isEmpty(operateName)){
        alert("domainFileName和operateName不能为空!");
    }
    //consultType 为参照类型，目前只有custom一种
    s = s + "&domainFileName=" + domainFileName+"&operateName="+operateName+"&"+returnValue+"&consultType=custom";
    // 是否有“取已存在的数据”参数
    if(returnValue.indexOf("getSavedData=true")<=0){
        s = s + "&getSavedData=true";
    }
    if((masterParams).trim()!=""){
		s = s + "&masterParams=" + masterParams;
	}
    var child = window.showModalDialog(s,window,_dialogWindowStatus);
}

/**
 * 打开数据字典参照窗口，可以多选择的数据字典组成的树
 * @param returnValue 调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 * @param typeCode	数据字典类型名 如机关代字:file_doc_num
 */
function openDictConsultRefM(returnValue,typeCode){
    var s = "consultAction!dictConsult.shtml?selectOpt=1&domainFileName=SysDictData&operateName=getParentNodeAll&treeId=arcInfo&showSubmitBtn=true";
    if(isEmpty(returnValue)){
        alert("returnValue不能为空!");
    }
    s = s +"&"+ returnValue;
    if(isEmpty(typeCode)){
    	alert("typeCode不能为空!");
    }
    s = s+"&typeCode="+typeCode;
    var child = window.showModalDialog(s,window,_dialogWindowStatus);
}
/**
 * 打开数据字典参照窗口，可以单选的数据字典组成的树
 * @param returnValue 调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 * @param typeCode	数据字典类型名 如机关代字:file_doc_num
 */
function openDictConsultRef(returnValue,typeCode){
    var s = "consultAction!dictConsult.shtml?domainFileName=SysDictData&operateName=getParentNodeAll&treeId=arcInfo&showSubmitBtn=true";
    if(isEmpty(returnValue)){
        alert("returnValue不能为空!");
    }
    s = s +"&"+ returnValue;
    if(isEmpty(typeCode)){
    	alert("typeCode不能为空!");
    }
    s = s+"&typeCode="+typeCode;
    var child = window.showModalDialog(s,window,_dialogWindowStatus);
}
/**
 * 打开用户级参照窗口（多选）。包括部门人员、岗位人员、角色人员
 *
 * @param (String) returnValue		调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 */
function openUserRefM(returnValue){
	//var windowStatus = 'height=500, width=580, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,status=no';
	var s = "consultAction!enterDb.shtml?directive=common/doubleConsult.ftl&selectOpt=1";
	s = s + "&" + returnValue;
	// 是否有“取已存在的数据”参数
	if(returnValue.indexOf("getSavedData=true")<=0){
		s = s + "&getSavedData=true";
	}
	//window.open (s, 'newwindow', windowStatus);
	var child = window.showModalDialog(s,window,_dialogWindowStatus);
}

/**
 * 打开部门级参照窗口（多选）。
 *
 * @param (String) returnValue		调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 */
function openDeptRefM(returnValue){
	//var windowStatus = 'height=500, width=580, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,status=no';
	var s = "consultAction!enterDb.shtml?directive=common/doubleConsult.ftl&selectOpt=1";
	s = s + "&" + returnValue;
	// 是否有“取已存在的数据”参数
	if(returnValue.indexOf("getSavedData=true")<=0){
		s = s + "&getSavedData=true";
	}
	//window.open (s, 'newwindow', windowStatus);
	var child = window.showModalDialog(s,window,_dialogWindowStatus);
}

/**
 * 打开通用参照窗口(单选，默认),支持自定义字典、表格标题配置
 *
 * @param (String) 	domainFileName		调用xml文件名
 * @param (String) 	operateName			调用的查询名称
 * @param (String) 	returnValue			调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 * @param (String)	propConfigName		tbXML文件中，表格标题配置名。无值可传null
 * @param (boolean)	isTreeOfDict		是否调用生成树状数据字典功能。本功能需要传入typeCodeOfDict参数。无值可传null
 * @param (String)	typeCodeOfDict		isTreeOfDict==true时，指定的自定义数据字典的代码。无值可传null
 * @param (String)	masterParams		指定根节点，无值可传null（无值或传null的场合默认为0）
 */
function openReference(domainFileName,operateName,returnValue,propConfigName,isTreeOfDict,typeCodeOfDict,masterParams){
	__openReference(false,domainFileName,operateName,returnValue,propConfigName,isTreeOfDict,typeCodeOfDict,masterParams);
}



/**
 * 打开通用参照窗口(多选)
 *
 * @param (String) 	domainFileName		调用xml文件名
 * @param (String) 	operateName			调用的查询名称
 * @param (String) 	returnValue			调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 * @param (String)	propConfigName		tbXML文件中，表格标题配置名。无值可传null
 * @param (boolean)	isTreeOfDict		是否调用生成树状数据字典功能。本功能需要传入typeCodeOfDict参数。无值可传null
 * @param (String)	typeCodeOfDict		isTreeOfDict==true时，指定的自定义数据字典的代码。无值可传null
 * @param (String)	masterParams		指定根节点，无值可传null（无值或传null的场合默认为0）
 */
function openReferenceM(domainFileName,operateName,returnValue,propConfigName,isTreeOfDict,typeCodeOfDict,masterParams){
	__openReference(true,domainFileName,operateName,returnValue,propConfigName,isTreeOfDict,typeCodeOfDict,masterParams);
}

/**
 * 打开通用参照窗口(多选)
 *
 * @param (boolean)	isMultiValue		是否多值选择
 * @param (String) 	domainFileName		调用xml文件名
 * @param (String) 	operateName			调用的查询名称
 * @param (String) 	returnValue			调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 * @param (String)	propConfigName		tbXML文件中，表格标题配置名。无值可传null
 * @param (boolean)	isTreeOfDict		是否调用生成树状数据字典功能。本功能需要传入typeCodeOfDict参数。无值可传null
 * @param (String)	typeCodeOfDict		isTreeOfDict==true时，指定的自定义数据字典的代码。无值可传null
 * @param (String)	masterParams		指定根节点，无值可传null（无值或传null的场合默认为0）
 */
function __openReference(isMultiValue,domainFileName,operateName,returnValue,propConfigName,isTreeOfDict,typeCodeOfDict,masterParams){
	if(typeof(propConfigName)=="undefined" || propConfigName==null){
		propConfigName = '';
	}
	if(typeof(isTreeOfDict)=="undefined" || isTreeOfDict==null){
		isTreeOfDict = false;
	}
	if(typeof(typeCodeOfDict)=="undefined" || typeCodeOfDict==null){
		typeCodeOfDict = '';
	}
	if(typeof(masterParams)=="undefined" || masterParams==null){
		masterParams = '';
	}
	if(domainFileName.toLowerCase()=="sysdept"&&operateName.toLowerCase()=="dept2"){
		if(isMultiValue==true){
			openUserRefM(returnValue);
		}else{
			openUserRef(returnValue);
		}
	}else{
	/*
		var windowStatus = 'height=540, width=450, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, location=no,status=no';
	*/
		var height = window.screen.height * 0.75;
		var width = window.screen.width * 0.5;
		var windowStatus = 'height=' + height + ', width=' + width + ', top=0,left=0, toolbar=no, menubar=no, scrollbars=no, location=no,status=no';
		var s = "consultAction!consult.shtml";
		if(isTreeOfDict==true){
			if((typeCodeOfDict).trim()==''){
				alert("使用数据字典树时，typeCode参数不能为空！");
				return;
			}
			s = "consultAction!dictConsult.shtml";
		}
		s = s + "?domainFileName=" + domainFileName;
		if(isTreeOfDict==true && (typeCodeOfDict).trim()!=''){
			s = s + "&typeCode=" + typeCodeOfDict;
		}
		s = s + "&top=1&operateName=" + operateName;
		if((propConfigName).trim()!=""){
			s = s + "&propConfigName=" + propConfigName;
		}
		if(isMultiValue==true){
			s = s + "&" + returnValue + "&selectOpt=1";
		}else{
			s = s + "&" + returnValue;
		}
		if((masterParams).trim()!=""){
			s = s + "&masterParams=" + masterParams;
		}
		//alert(s+"&rand=" + Math.random());
		window.open (s+"&rand=" + Math.random(), 'newwindow', windowStatus);
		//var child = window.showModalDialog(s,window,_dialogWindowStatus);
	}
}

/**
 * 	根据不同的人员类型，选择不同的人员范围
 * 
 * @param string seleObjId		人员类型的下拉选择框对象id
 * @param string valueEleId		存放返回值id的对象id
 * @param string titleEleId		存放返回值名称的对象id
 */
function selectUsersForType(seleObjId,valueEleId,titleEleId){
	seleObjId = seleObjId.replace(".","\\.");
	var type = $('#' + seleObjId).val();
	var rtn = valueEleId + '=value1&' + titleEleId + '=value2';
	switch (type.toUpperCase()) {
		case "NULL":
			break;
		case "USER":
			//本单位个人
			openReferenceM('SysUser', 'showEditDeptUserTree2', rtn,null,null,null,$("#cur_orgDeptRootId").val());
			break;
		case "USER_SYS":
			//所有单位的个人
			openReferenceM('SysUser', 'showEditDeptUserTreeAll', rtn);
			break;
		case "USER_SYS_HIDDEN":
			//所有单位的个人
			openReferenceM('SysUser', 'showEditDeptUserTreeAllHidden', rtn);
			break;
		case "DEPT":
			//本单位的部门
			openReferenceM('SysDept', 'showEditDeptTree2', rtn ,null,null,null,$("#cur_orgDeptRootId").val())
			break;
		case "DEPT_SYS":
			//所有单位的部门
			openReferenceM('SysDept', 'showEditDeptTreeAll', rtn)
			break;
		case "ORG_SYS":
			//所有单位
			openReference('sysOrg', 'getOrg', rtn)
			break;
		case "ORGS_SYS":
			//所有单位(多选)
			openReferenceM('sysOrg', 'getOrg', rtn)
			break;	
		case "GROUP":
			//本单位的岗位
			openReferenceM('PermUserGroup', 'groupTree', rtn);
			break;
		case "GROUP_SYS":
			//所有单位的岗位
			openReferenceM('PermUserGroup', 'sysGroupTree', rtn);
			break;
		case "ROLE":
			//角色
			openReferenceM('PermUserRole', 'listRole2', rtn);
			break;
		case "ORG":
			//本单位的全体人员
			alert("你已选择了本单位全体人员！");
			break;
		case "ALL":
			//所有单位的全体
			alert("你已选择了所有单位的全体人员！");
			break;
		default:
			alert("请先选择人员类型！");
	}
}
/**
 *	人员类型选择树改变时，清空相关值
 *
 * @param string obj			人员类型的下拉选择框对象。调用时传入this即可
 * @param string valueEleId		存放返回值id的对象id
 * @param string titleEleId		存放返回值名称的对象id
 */
function onSelectTypeChange(obj,valueEleId,titleEleId){
	valueEleId = valueEleId.replace(".","\\.");
	titleEleId = titleEleId.replace(".","\\.");
	if(!isEmpty($("#" + valueEleId).val()) && confirm("重新选择会清空已选的值，你确认吗?")){
		$("#" + valueEleId).val("");
		$("#" + titleEleId).val("");
	}
	if($(obj).val().toUpperCase()=="ORG"){
		$("#" + valueEleId).val(_orgId);
		$("#" + titleEleId).val("<" + _orgName + ">的全体人员");
	}else if($(obj).val().toUpperCase()=="ALL"){
		$("#" + valueEleId).val(_orgId);
		$("#" + titleEleId).val("全体人员");
	}
}

/**
 * 取得json格式的参照数据(数组形式)
 * 
 * @param String domainFileName		tbXML文件名
 * @param String operateName		参照名
 * @param String masterParams		queryMaster中的参数
 * @param String detailParams		queryDetail中的参数
 * 
 * @return arrayJson
 */
function openReferenceJson(domainFileName,operateName,masterParams,detailParams){
	return	__openReferenceJson(domainFileName,operateName,"",masterParams,detailParams,0);
}

/**
 * 取得json格式的参照数据(将数据组装成page对象形式)
 * 
 * 
 * @param String domainFileName		tbXML文件名
 * @param String operateName		参照名
 * @param String propConfigName		列表标题配置名
 * @param String masterParams		queryMaster中的参数
 * @param String detailParams		queryDetail中的参数
 * 
 * @return {}
 */
function openReferenceJsonPage(domainFileName,operateName,propConfigName,masterParams,detailParams){
	if(typeof(propConfigName)=="undefined" || propConfigName==null || propConfigName==false){
		propConfigName = "default";
	}
	return	__openReferenceJson(domainFileName,operateName,propConfigName,masterParams,detailParams,1);
}


/**
 * 取得json格式的参照数据(返回数组型数据，或是page对象)
 * 
 * @param String domainFileName		tbXML文件名
 * @param String operateName		参照名
 * @param String propConfigName		列表标题配置名
 * @param String masterParams		queryMaster中的参数
 * @param String detailParams		queryDetail中的参数
 * @param int toPage				是否转换成page对象
 * 
 * @return JsonObject
 */
function __openReferenceJson(domainFileName,operateName,propConfigName,masterParams,detailParams,toPage){
	var isRight = true;
	var datas = null;
	if(typeof(masterParams)=="undefined" || masterParams==null){
		masterParams = "";
	}
	if(typeof(detailParams)=="undefined" || detailParams==null){
		detailParams = "";
	}
	$.ajax({
		type: 	"POST",
		dataType:"json",
		async:	false,		// 同步调用
		cache:	false,		// 不缓存数据
		url: "./consultAction!consultJson.shtml",
		data: {
			"domainFileName"		:	domainFileName,
			"operateName"			:	operateName,
			"propConfigName"		:	propConfigName,
			"masterParams"			:	masterParams,
			"detailParams"			:	detailParams,
			"toPage"				:	toPage
		},
		success: function(data){
			if(typeof(data.fail)!="undefined"){
				alert("调用生成json参照数据时出错:" + data.fail);
				isRight = false;
				return false;
			}else{
				datas = data;
				isRight = true;
				return true;
			}
		},
		error:function (XMLHttpRequest, textStatus, errorThrown) {
			alert(JSON.encode(errorThrown));
			alert("调用生成json参照数据时出错！");
			isRight = false;
			return false;
		}
	});
	return	datas;
}

/**
 * 打开通用双表参照窗口(单选，默认)
 *
 * @param (String) returnValue		调用页面的返回域名称,形如：deptname=value2&sysDept.sysDept.id=value1
 */
function openDReference(returnValue){
	//var windowStatus = 'height=440, width=450, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,status=no';
	var s = "consultAction!consult.shtml?" + returnValue;
	//window.open (s, 'newwindow', windowStatus);
	var child = window.showModalDialog(s,window,_dialogWindowStatus);
}

/**
 * 打开附件管理模块窗口。多版本控制
 *
 * @param (String) formId		调用附件窗口的表单id
 * @param (String) docId		文档id（当前数据id）
 * @param (boolean) isTypeManage	是否需要附件分类管理功能
 */
function openAttachment(formId,docId,isTypeManage){
	var typeManage=0;
	if(typeof(isTypeManage)=="undefined" || isTypeManage==null)	{
		typeManage = 0;
	}else if(isTypeManage==true){
		typeManage = 1;
	}else{
		typeManage = 0;
	}
	var windowStatus = 'height=440, width=600, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,status=no';
	var s = "attachmentAction!list.shtml?formId=" + formId + "&docId=" + docId + "&typeManage=" + typeManage;
	window.open (s, 'attachments', windowStatus);
}

/**
 * 打开附件管理模块窗口。没有多版本控制功能
 *
 * @param (String) formId		调用附件窗口的表单id
 * @param (String) docId		文档id（当前数据id）
 * @param (boolean) isTypeManage	是否需要附件分类管理功能
 */
function openAttachmentS(formId,docId,isTypeManage){
	var typeManage=0;
	if(typeof(isTypeManage)=="undefined" || isTypeManage==null)	{
		typeManage = 0;
	}else if(isTypeManage==true){
		typeManage = 1;
	}else{
		typeManage = 0;
	}
	var windowStatus = 'height=440, width=600, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,status=no';
	var s = "attachmentAction!list.shtml?formId=" + formId + "&docId=" + docId + "&typeManage=" + typeManage;
	s = s + "&multiversion=false";
	window.open (s, 'attachments', windowStatus);
}

/**
 * 打开新窗口(非模式窗口)。可以指定width、height，如果不指定的话，则为全屏
 *
 * @param (String) url			窗口的url地址
 * @param (String) width		宽度。null则全屏
 * @param (String) height		高度。null则全屏
 * @param (String) newWinName	新窗口名。空则用默认的"NewWin"
 */
function openNewWin( url, width, height, newWinName ){
	var status = "toolbar=no,location=no,directories=no,status=no,menubar=no,resizable=yes,scrollbars=yes,";
	if(typeof(newWinName)=="undefined" || newWinName==null){
		newWinName = "NewWin";
	}
	var newwin = window.open( url, newWinName, status);
	if(typeof(width)=="undefined" || width==null || typeof(height)=="undefined" || null){
        newwin.moveTo(0, 0);
        newwin.resizeTo(screen.availWidth, screen.availHeight);
	}else{
      	var   top=	((screen.availHeight - height)/2);
      	var   left=	((screen.availWidth - width)/2);

      	newwin.moveTo(left,   top);
        newwin.resizeTo(width, height);
	}
	newwin.focus();
	return newwin;
}

/**
 * 根据随机安适产生一个窗口名，用于新打开的窗口。通过不同的窗口名，可以防止内容被覆盖问题
 * 窗口名形如：winXXX
 * 
 * @param {boolean} isRand	是否随机生成窗口名。true:随机生成;false:窗口名为：NewWin
 * @return {string}
 */
function getNewWinName(isRand){
	if(typeof(isRand)=="undefined" || isRand==true){
		var name = "NewWin" + Math.floor(Math.random()*1000);
		return name;
	}else{
		return	"NewWin";
	}
}

/**
 * 打开对话框窗口(模式窗口)
 *
 * @param (String) url			窗口的url地址
 * @param (String) width		宽度
 * @param (String) height		高度
 */
function openDialog( url, width, height)
{
	if(typeof(width)=="undefined" || typeof(height)=="undefined"){
		newwin = showModalDialog( url, _dialogWindowStatus);
	}else{
		var s= "scroll:no;status:no;resizable:yes;dialogHeight:" + height + "px;dialogWidth:" + width + "px;top:0;left:0;";
		newwin = showModalDialog( url,s);
	}
}

/**
 * 打开cell的打印、预览窗口
 */
function openCellPrint(){
	openNewWin("r.shtml?p=/common/cellprint.ftl");
}





/**======================================================================================
 *
 * 						以下为String字符串对象功能增强函数
 *
 ======================================================================================*/
/**
 * 删除字符串前后的空格
 */
String.prototype.trim = function()
{
	return this.replace( /(^\s*)|(\s*$)/g, '' ) ;
}

/**
 * 判断字字符串是否以指定的子串开头
 *
 * @param (String) value		指定的子串
 */
String.prototype.startsWith = function(value)
{
	return ( this.substr( 0, value.length ) == value ) ;
}

/**
 * 从字符串中的指定位置开始，删除指定长度的子串
 *
 * @param (String) start		开始位置
 * @param (String) length		要删除的子串的长度
 */
String.prototype.remove = function(start,length)
{
	var s = '' ;

	if ( start > 0 )
		s = this.substring( 0, start ) ;

	if ( start + length < this.length )
		s += this.substring( start + length , this.length ) ;

	return s ;
}

/**
 * 进行字符串的批量查找替换（查找、替换的内容是一对一的数组，即可以进行批量的替换）
 *
 * @param (String) searchArray
 * @param (String) replaceArray
 */
String.prototype.replaceAll = function(searchArray,replaceArray)
{
	var replaced = this ;

	for ( var i = 0 ; i < searchArray.length ; i++ )
	{
		replaced = replaced.replace( searchArray[i], replaceArray[i] ) ;
	}

	return replaced ;
}

/**
 * 将字符串转换为标题样式
 */
String.prototype.toTitleCase = function(){
	var temp_string = this.toLowerCase();
	var left_string;
	var right_string;
	var new_letter;
	var first_char = temp_string.left(1).toUpperCase();
	temp_string = first_char + temp_string.substring(1);
	var space_location = temp_string.indexOf(" ");
	while(space_location != -1){
		left_string = temp_string.left(space_location + 1);
		new_letter = temp_string.charAt(space_location + 1).toUpperCase();
		right_string = temp_string.right(temp_string - space_location - 2);
		temp_string = left_string + new_letter + right_string;
		space_location  = temp_string.indexOf(" ",space_location + 1);
	}
	return temp_string;
}

/**
 * 查找字符串并进行替换
 * (replace_string可以是一个字符串数组，进行批替代处理)
 *
 * @param (String) find_string			要查找的字符串
 * @param (String) replace_string		替换成的字符串
 */
String.prototype.replaceString = function(find_string,replace_string){
	var temp_string = this;
	var left_string;
	var right_string;
	var start_location;

	var replace_location = temp_string.indexOf(find_string);
	var i = 0;
	while(replace_location != -1){
		left_string = temp_string.left(replace_location);

		right_string = temp_string.substring(replace_location + find_string.length);
		if(typeof replace_string == "object" && replace_string.length > 0){
			temp_string  = left_string + replace_string[i] + right_string;
			start_location = replace_location  + replace_string[i].length;
		}
		else{
			temp_string  = left_string + replace_string + right_string;
			start_location = replace_location  + replace_string.length;
		}
		replace_location = temp_string.indexOf(find_string,start_location);
		i++;
	}
	return temp_string;
}


/**
 * 取字符串左边的子串(从最左边开始取)
 *
 * @param (String) total_chars		要取的字符个数
 */
String.prototype.left = function(total_chars){
	return this.substring(0,total_chars);
}

/**
 * 取字符串右边的子中(从最右边开始取)
 *
 * @param (String) total_chars		要取的字符个数
 */
String.prototype.right = function(total_chars){
	return this.substring(this.length -total_chars);
}

/**
 * 将日期格式的字符串转换为Date对象
 * @return {}
 */
String.prototype.toDate = function(){
	return new Date(Date.parse(this.replace(/-/g,   "/")));   
}

/**
 * 格式化字符串函数(删除前后空格)
 * 本方法直接调用了String.prototype.trim()方法
 *
 * @param (String) str		源字符串
 */
function trim(str)
{
	return	str.trim();
}
//====================================================================================================================




/**
 * 	取得url中的参数
 *
 * 	调用方式：src中保存参数值
 * var args = getUrlArgs();
 * if (args.src) src = parseInt(args.src);		//取得整数值
 * if (args.src) src = args.src;				//取得值
 */
function getUrlArgs(){
	var args = new Object();
	var query = location.search.substring(1);		//获取查询串
	var pairs =query.split("&");					//在逗号处断开
	for (var i = 0;i < pairs.length;i++){
		var pos = pairs[i].indexOf('=');			//查找"name=value"
		if(pos == -1) continue;						//如果没有找到，就跳过
		var argname = pairs[i].substring(0,pos);	//提取name
		var value = pairs[i].substring(pos+1);		//提取value
		args[argname] = unescape(value);			//存为属性
	}
	return args;
}


/**
 * 取得url中的action名
 *
 * 调用方式：
 * actName = getUrlActionName(url);
 *
 * @param (String) url		形如以下的action调用格式：http://xxx.xxx/joa/xxxxAction!list.shtml
 */
function	getUrlActionName(url){
	if(!url || url=="")
		alert("传入的url参数不能为空!");
	var beginPos = url.lastIndexOf("/");
	var methonPos = url.lastIndexOf("!");			//看本url地址是否包含action的方法
	var extPos = url.lastIndexOf(".");				//查找到“.扩展名”的位置
	var endPos;
	if(methonPos >= extPos){
		alert("扩展符.与方法符!不能处于同一位置！");
	}
	if(beginPos<=0)
		alert("获取本页面的url有错：actName不能为空！");
	if(methonPos<=0)
		endPos = extPos;
	else
		endPos = methonPos;
	var actName = url.substring(beginPos + 1,endPos);
	return	actName;
}

/**
 * 取得元素所处位置
 *
 * 用法：
 * 	把你要获取的对象传进去.
 * 	var   point   =   getPoint(obj);
 * 	point.x是左边距
 * 	point.y是上边距
 *
 * @el	元素对象
 * @return	是一个对象，包含x、y两个属性
 */
function getPoint(el) {
	for (var lx = 0, ly = 0;el != null; lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
	return {
		x : lx,
		y : ly
	}
}


/**
 * js文件中获取本js文件的详细路径。<br>
 * 本方法的作用：以便根据其他文件与该js的相对位置计算并设置其他一些文件如图片、css样式或脚本的目录路径
 */
function getJsFilePath(jsFileName) {
	return getJsFileAbsPath(jsFileName);
	
//	var js = document.getElementsByTagName('script');
//	var jsPath = "";
//	for (var i = js.length;i > 0; i--) {
//		if (js[i - 1].src.indexOf(jsFileName) > -1) {
//			jsPath = js[i - 1].src.substring(0, js[i - 1].src.lastIndexOf("/")
//					+ 1);
//			//类似于src="xxx.js"方式的引用，是找不到"/"符号的
//			if(jsPath==null || jsPath==""){
//				jsPath="./";
//			}
//		}
//	}
//	if(jsPath==""){
//		alert("调用getJsFilePath()方法时出错：找不到此js文件！" + jsFileName);
//		return;
//	}
//	return jsPath;
}

/**
 * 得到给定Js文件的绝对路径
 * 可通过这个绝对路径在js文件中引用相对它的其它文件路径
 * c:/aa.html,(在此文件中引入aa.js:<script src='aa.js'></script>)
 * c:/aa.js
 * c:/bb/
 * c:/bb/cc.js
 * 如在aa.html中使用getPath("aa.js") + "../bb/cc.js",这样便是指向到与aa.js同级的目录bb下的cc.js文件
 * 20080506 yuanjq
 */
function	getJsFileAbsPath(jsFileName){
	var	e	=	{};
	var	htmlPath	=	"";
	var	jsPath	=	"";	
	if	(	document.location.protocol	==	'file:'){
		e.BasePath	=	unescape(document.location.pathname.substr(1)	)	;
		e.BasePath	=	 e.BasePath.replace( /\/\//gi, '/' ) ;
		e.BasePath	=	'file://'	+	e.BasePath.substring(0,e.BasePath.lastIndexOf('/') +1 );
		e.FullBasePath	=	e.BasePath	;
	}else{
		e.BasePath	=	document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1)	;
		e.FullBasePath	=	document.location.protocol	+	'//'	+	document.location.host	+	e.BasePath	;
	}

	htmlPath	=	e.FullBasePath;	
	var	scriptTag	=	document.getElementsByTagName("script");
	for(var	i=0;i<scriptTag.length;i++){
		if(scriptTag[i].src.lastIndexOf(jsFileName)	>=	0){			
			var	src	=	scriptTag[i].src.replace( /\/\//gi, '/') ;	//把/转换为/
			if(src.toLowerCase().indexOf("file://")==0){// http全路径形式 file://
				var	_temp	=	src.substring(0,src.lastIndexOf('/')+1);
				jsPath	=	_temp;
				// alert("file://")
			}else	if(src.toLowerCase().indexOf("http://")==0){// http全路径形式 http://
				var	_temp	=	src.substring(0,src.lastIndexOf('/')+1);
				jsPath	=	_temp;				
				// alert("http://")
			}else	if(src.toLowerCase().indexOf("https://")==0){// http全路径形式 https://
				var	_temp	=	src.substring(0,src.lastIndexOf('/')+1);
				jsPath	=	_temp;				
				// alert("https://")
			}else	if(src.toLowerCase().indexOf("../")==0){// 相对路径形式 ../
				jsPath	=	htmlPath	+	src.substring(0,src.lastIndexOf('/')+1);
				// alert("../")
			}else	if(src.toLowerCase().indexOf("./")==0){// 相对路径形式 ./
				jsPath	=	htmlPath	+	src.substring(0,src.lastIndexOf('/')+1);
				// alert("./")
			}else	if(src.toLowerCase().indexOf("/")==0){// 相对路径形式 /,只有采用http访问时有效
				if(document.location.protocol	==	'http:'	||	document.location.protocol	==	'https:'){
					var	_temp	=	document.location.protocol	+	"//"	+	document.location.host	+	src.substring(0,src.lastIndexOf('/')+1);
					jsPath	=	_temp;
				}
				// alert("/")
			}else	if(src.toLowerCase().search(/^([a-z]{1}):/)	>=0){// 盘符形式 c:
				var	_temp	=	src.substring(0,src.lastIndexOf('/')+1);
				jsPath	=	_temp;
				// alert("^([a-z]+):")
			}else{// 同级形式
				jsPath	=	htmlPath;
			}
		}
	}
	return	jsPath;
}

/**
 * 动态(按需)加载js和css文件
 *
 * @path 要加载的文件的全路径
 * @type 要加载的文件的类型，分：css、js两种。本参数可空，空的情况取加载的文件的扩展名
 */
function loadCssJsFile(path,type,title){
	var s,i;
	if(!type) type=path.substr(path.lastIndexOf(".")+1);
	if(type=="js"){
	    var ss=document.getElementsByTagName("script");
	    for(i=0;i<ss.length;i++){
	        if(ss[i].src && ss[i].src.indexOf(path)!=-1 || ss[i].title==title)return ss[i];
	    }
	    s=document.createElement("script");
	    s.type="text/javascript";
	    s.src=path;
	    if(title) s.title=title;
	}
	else if(type=="css"){
	    var ls=document.getElementsByTagName("link");
	    for(i=0;i<ls.length;i++){
	        if(ls[i].href && ls[i].href.indexOf(path)!=-1 || ls[i].title==title)return ls[i];
	    }
	    s=document.createElement("link");
	    s.rel="stylesheet";
	    s.type="text/css";
	    s.href=path;
	    if(title) s.title=title;
	    s.disabled=false;
	}
	else return;
	var head=document.getElementsByTagName("head")[0];
	head.appendChild(s);
	return s;
}

/**
 * 屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键
 */
function KeyDown(){
	if ((window.event.altKey)&&
	((window.event.keyCode==37)|| //屏蔽 Alt+ 方向键 ←
	(window.event.keyCode==39))){ //屏蔽 Alt+ 方向键 →
		alert("不准你使用ALT+方向键前进或后退网页！");
		event.returnValue=false;
	}
	/* 注：这还不是真正地屏蔽 Alt+ 方向键，
	因为 Alt+ 方向键弹出警告框时，按住 Alt 键不放，
	用鼠标点掉警告框，这种屏蔽方法就失效了。以后若
	有哪位高手有真正屏蔽 Alt 键的方法，请告知。*/

	if ((event.keyCode==8) || //屏蔽退格删除键
	(event.keyCode==116)|| //屏蔽 F5 刷新键
	(event.ctrlKey && event.keyCode==82)){ //Ctrl + R
		event.keyCode=0;
		event.returnValue=false;
	}
	if ((event.ctrlKey)&&(event.keyCode==78)) //屏蔽 Ctrl+n
		event.returnValue=false;
	if ((event.shiftKey)&&(event.keyCode==121)) //屏蔽 shift+F10
		event.returnValue=false;
	if (window.event.srcElement.tagName == "A" && window.event.shiftKey)
		window.event.returnValue = false; //屏蔽 shift 加鼠标左键新开一网页
	if ((window.event.altKey)&&(window.event.keyCode==115)){ //屏蔽Alt+F4
		window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
		return false;
	}
}




/**
 * 设置对象是否只读
 * @param (String) objId		对象id
 * @param (Object) isReadOnly	是否只读
 */
function setReadOnly(objId,isReadOnly){
	if(typeof(isReadOnly)!="undefined" && isReadOnly==true){
		$("#" + objId).prop("disabled",true);
		$("#" + objId).css("background-color", "#c0c0c0");
	}else{
		$("#" + objId).prop("disabled",false);
		$("#" + objId).css("background-color", "#ffffff");
	}
}












/**
 * 打开等待窗口。显示请用户等待的信息(在最顶级的窗口调用)
 * 
 * @param {string} prompt
 */
function openWaitDialog(prompt){
	getTopWindow()._openWaitDialog(prompt);
}



/**
 * 打开等待窗口。显示请用户等待的信息
 * 
 * @param {string} prompt	提示信息
 */
function _openWaitDialog(prompt){
	var temp_float = new Array();

	var vwidth = "350";
	var vheight = "auto";

	if(typeof(prompt)=="undefined" || prompt==null || prompt==""){
		prompt = "系统正在执行，请您稍候....."
	}
	
	if($("#_waitdialogbackground").length == 0){
		// 用于实现半透明的背景
		temp_float.push("<div id='_waitdialogbackground' style=\"display:none;height:" + $(document).height() + "px;" + "width:" + $(document).width() + "px;z-index:1998;background:#808080;position:absolute;top:0;left:0;filter:alpha(opacity=0);opacity:0;\"></div>");
		//用于遮挡select的iframe
		temp_float.push('<iframe id="_dialogbgiframe" frameborder="0" tabindex="-1" src="javascript:false;" style="display:block;position:absolute;z-index:1999;-moz-opacity:0; filter:alpha(opacity=0);margin:0;padding:0;height:' + $(document).height() + 'px;width:' + $(document).width() + 'px;top:0;left:0;"/>');
		// 下面这些是用来 提示框的div 包括 标题栏， 内容栏
		temp_float.push("<div id='_waitdialogcontent' style=\"z-index:2000;display:none;border:#7eabcd 5px solid;width:" + vwidth + ";position:absolute;background:#fff;background-image:url(" + _skinPath + "/images/bg1/bg.gif);\" align='center'>");
		//内容栏
		temp_float.push("<div class=\"content\" style=\"font-size:16px;padding:20px 15px;\"><img src='./skin/default/images/web/loading.gif'>&nbsp;&nbsp;&nbsp;" + prompt + "</div>");
		temp_float.push("</div>");
		$("body").append(temp_float.join(""));
	}

	$boxBg = $("#_waitdialogbackground");
	$floatBox = $("#_waitdialogcontent");
	$frame = $("#_dialogbgiframe");


	var vleft = (($(document).width())/2-(parseInt(vwidth)/2))+"px";
	var vtop = ($(document).scrollTop()+(vheight=="auto"?$("body").height():parseInt(vheight)))/2.5+"px";

	$boxBg.show();
	$boxBg.animate({opacity:"0.5"},"fast");
	$frame.show();
	$floatBox.show();
	$floatBox.css({left:vleft,top:vtop,width:vwidth,height:vheight});
	$floatBox.animate({top:vtop},"fast");


	//设定多少时间后隐藏。提供自动隐藏功能。默认60秒自动关闭本窗口
	//setTimeout(function(){
	//	closeWaitDialog();
	//},60*1000);
}

/**
 * 关闭等待窗口(在最顶级的窗口调用)
 */
function closeWaitDialog(){
	getTopWindow()._closeWaitDialog();
}

/**
 * 关闭等待窗口
 */
function _closeWaitDialog(){
	$("#_waitdialogcontent").hide();
	$("#_dialogbgiframe").hide();
	$("#_waitdialogbackground").hide();
}

/**
 * 取得最顶级窗口
 * 
 * @return window
 */
function getTopWindow(){
	var pw = window;
	while(pw!=pw.parent){
		pw = pw.parent;
	}
	return pw;
}





/**
 * 生成cell中的表格数据
 *
 *
 *
 *
 * 对存放表格的要求：
 * 1、表格结构如下：
 * 		<table>
 * 			<thead>
 * 				<tr>
 * 					<th dataType='xxx'>...</th>
 * 					...
 *				</tr>
 *			</thead>
 *			<tbody>
 *				<tr>
 *					<td>...</td>
 *					...
 *				</tr>
 *			</tbody>
 *		</table>
 *		即表格结构与pager.ftl生成的一致
 *
 * 2、thead中放标题，并且th带dataType属性，属性值请参照checkInput中的数据类型。一般取自tbXML文件中的dataType
 * 3、tbody中放数据
 *
 * @param (Object)cellData		cellDefault类型的json对象数据，无值的为传入{}。可为空
 * @param (Object)$table		存放数据的表格的jquery对象。可为空，默认为$("table.list")
 */
function	getCellDataForTable(cellData,$table){
	if(typeof(cellData)=="undefined"){
		cellData = {};
	}
	if(typeof($table)=="undefined"){
		$table = $("table.list");
	}

	cellData.rows = $table.find("tbody").find("tr").length;
	cellData.tableDatasType = new Array();
	cellData.tableDatas = new Array();

	$table.find("thead").find("th[dataType]").each(function(col){
		cellData.tableDatasType.push($(this).attr("dataType"));
	});


	$table.find("tbody").find("tr").each(function(row){
		var rowData = new Array();
		$("td span",$(this)).each(function(col){
			var txt = $(this).text();
			rowData.push(txt);
		});
		cellData.tableDatas.push(rowData);
	});
	return	cellData;
}
/**
 * 生成cell中的表单元素值。标题中的":"、"："会被自动去掉
 *
 * 对表单元素的要求：
 * 1、标题都存放在<label>元素中，并且要有"for"属性指定属于哪个表单元素。
 * 2、checkbox、radio元素的值所对应的中文内容，放在"title"属性中。
 * 3、只读情况下，元素内容放在<span>元素中。
 * 以上要求请参照标准模板生成的结果
 *
 * @param	(Object)cellData		cellDefault类型的json对象数据，无值的为传入{}。可为空
 * @param	(Object)$itemContain	存放表单元素数据的jquery对象。可为空，默认为$("form")
 */
function	getCellDataForForm(cellData,$itemContain){
	if(typeof(cellData)=="undefined"){
		cellData = {};
	}
	if(typeof($itemContain)=="undefined"){
		$itemContain = $("form");
	}
	cellData.formDatas = new Array();
	// 要表单元素的标题要求都放在label元素中，并且有"for"属性
	$itemContain.find("label[for]").each(function(){
		var label = $(this).text();
		var name = $(this).attr("for");			//.replaceString(".","\\.");
		var $item = $("[name='" + name + "']",$itemContain);
		if($item.length == 0){
			return;
		}
		var value = "";
		switch($item.attr("tagName").toLowerCase()){
			case	"span":				// 只读的情况下，值被包含在span中
				value = $item.text();
				break;
			case	"input":
				switch($item.attr("type")){
					case	"text":
						value = $item.val();
						break;
					case	"checkbox":					// 值保存在title中
						value = $item.attr("title");
						break;
					case	"radio":					// 值保存在title中
						value = $item.attr("title");
						break;
				}
				break;
			case	"select":
				switch($item.attr("type")){
					case	"select-one":				// 单选
						value = $item.find("option:selected").text();
						break;
					case	"select-multiple":			// 多选
						var va = new Array();
						$item.find("option:selected").each(function(){
							va.push($(this).text());
						});
						value = va.join(",");
						break;
				}
			case	"textarea":
				value = $item.val();
				break;
		}
		//alert("label:" + label + "  		value:" + value);
		// 去除名称中的":"、"："符号
		label.replaceString(":","").replaceString("：","");
		var item = [label,value];
		cellData.formDatas.push(item);
	});
	return	cellData;
}

/**
 * 判断fck（即html编辑器）是否为空，为空则返回false，反之返回true
 * @String	instanceName对象名称
 */
function GetContents(instanceName) {
	// Get the editor instance that we want to interact with.
	var oEditor = FCKeditorAPI.GetInstance(instanceName);
	if (oEditor.GetXHTML(true) == "" || oEditor.GetXHTML(true) == "undefined")
		return false;
	else
		return true;
}
/**
 * 判断值是否为空
 */
function	isEmpty(val){
	if(typeof(val)=="undefined")
		return true;
	if(val==null)
		return	true;
	if(typeof(val)=="string" && val.trim()=="")
		return	true;
	if(val=="undefined")
		return true;
	return false;
}
/**针对表单中的input或页面中的textarea输入的内容，
 * 在光标失去焦点的时候进行两边去空格处理*/
$(function(){
	$("form input[type=text]").on("blur",function(){
		if($(this).prop("readonly")){
			
		}else{
			var _val=$(this).val();
			$(this).val(_val.trim());
		}
	});
	$("textarea").on("blur",function(){
		var _val=$(this).text();
		$(this).text(_val.trim());
	});
});
